數位邏輯 (Digital Logic) 是用來代表電路輸入與輸出的控制,橫跨非常多領域,可以用電子、電腦科學、數學…etc 來解釋。
數位邏輯基本上就是在控制 0, 1 輸入到某些黑箱子之後,要選擇輸出什麼,基於這個簡單的原理,便可以發展出各種應用機制。
這個黑箱子就叫做邏輯閘,最最最基礎的邏輯閘就這三種,其餘的都是這三種的組裝變化 (可自行參考 Wiki)。
每個邏輯閘都有對應的真值表,意思就是兩個輸入跟輸出的對應關係。
真值表:
AND
OR
NOT
為什麼一開始只需要知道這三種就好,因為其他的邏輯閘都是從上面延伸而來的,比方說 NAND 閘,基本上就是先做了 AND 再接一個 NOT:
等同於
真值表也就是把 AND 每一個反過來。
像這樣的邏輯閘,從最基本的一個電晶體開始建構,直到使用 IC ,具象化出來就是一顆 IC 晶片 (TTL 的 7400 系列, CMOS 的74HC 系列 ),以及多工器,一直到可程式化的晶片,甚至現在直接寫 VHDL 設計 VLSI 產生整個邏輯電路,都有邏輯閘的存在。
從應用面來說,你可以用邏輯閘做出搶答電路、加法電路,各種運算電路,不過現在倒不需要這麼土炮了。
對任何程式語言都可以使用 AND, OR 來做邏輯判斷:
if(doorOpen == true) {
If(detection == "human") {
console.log("hello")
}
}
透過 AND 就可以做成:
if (doorOpen && detection == "human" ) {
console.log("hello");
}
對程式來說,上述的 code 就式有兩個輸入做 AND 運算:
那假設有三個呢?
if ((doorOpen && detection == "human" ) && time == "7:00 AM") {
console.log("hello");
}
為了避免探討語言執行先後順序這種很不直覺得寫法,所以我就加了括號,這要怎樣表現成邏輯閘?,加在後面就好了:
數位邏輯是一門學科,早已有成熟的方法與定理可以畫簡超大型邏輯閘,最耳熟能詳的就是卡諾圖,由於卡諾圖畫簡方法不夠在本篇文章敘述,對於高階程式開發者來說並不是那麼重要的事,則可自行延伸閱讀。
假設 2B 是變數,根據程式語法 OR 運算會把兩邊的元素做 OR 得到:
所以這個東西就直接會變成永遠都是 1 的邏輯,畫簡起來簡潔有力:
就是什麼都不要加。
References:
[1] https://zh.wikipedia.org/wiki/%E9%82%8F%E8%BC%AF%E9%96%98